﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;

namespace Emporium_Web
{
    public partial class PedidosCompraList : System.Web.UI.Page
    {
        public string SortExpression
        {
            get
            {
                return ViewState["gv_SortExpression"] == null ? "" : ViewState["gv_SortExpression"].ToString();
            }
            set
            {
                ViewState["gv_SortExpression"] = value;
            }
        }

        public string SortDirection
        {
            get
            {
                return ViewState["gv_SortDirection"] == null ? "" : ViewState["gv_SortDirection"].ToString();
            }
            set
            {
                ViewState["gv_SortDirection"] = value;
            }
        }

        private int IdSeleccionado
        {
            get { return (int)ViewState["IdSeleccionado"]; }
            set { }
        }

        /// <summary>
        /// Los componentes.
        /// </summary>
        private List<PedidoContador> PedidoContadorList
        {
            get
            {
                return ViewState["PedidoContadorList"] == null ? null : (List<PedidoContador>)ViewState["PedidoContadorList"];
            }
            set
            {
                ViewState["PedidoContadorList"] = value;
            }
        }

        [Serializable]
        private class PedidoContador
        {
            public int CodigoPedido { get; set; }
            public int PrendasProducir { get; set; }
            public int PrendasSolicitadas { get; set; }
            public decimal Total { get; set; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Master.ActualizaMenu(MenuPrincipal.Comercial, (int)MenuComercial.PedidosCompra);
                Master.AgregarBreadcrumb("Pedidos de Compra", "#", true);
                Master.AgregarBreadcrumb("Listado", "#", false);

                warningMessage.Visible = false;
                errorMessage.Visible = false;
                lblMensajeGridFooter.Text = String.Format(Resources.MensajesValidacion.GridFooterMessage, 3);

                PedidoContadorList = new List<PedidoContador>();
                ListarPedidos();
            }
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                ListarPedidos();
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnAdicionar_Click(object sender, EventArgs e)
        {
            Response.Redirect("PedidosCompraForm.aspx?Operacion=" + (int)AccionesForm.Adicionar);
        }

        protected void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(hdnSeleccion.Value.ToString(), out codigo))
                {
                    Response.Redirect("PedidosCompraForm.aspx?Operacion=" + (int)AccionesForm.Modificar + "&PedidoCompraId=" + codigo);
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(hdnSeleccion.Value.ToString(), out codigo))
                {
                    Eliminar();
                    ListarPedidos();
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnConsultar_Click(object sender, EventArgs e)
        {
            try
            {
                int codigo = 0;
                if (Int32.TryParse(((LinkButton)sender).Text, out codigo))
                {
                    Response.Redirect("PedidosCompraForm.aspx?Operacion=" + (int)AccionesForm.Consultar + "&PedidoCompraId=" + codigo);
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        private void Eliminar()
        {
            int PedidoCompraId = 0;
            if (Int32.TryParse(hdnSeleccion.Value.ToString(), out PedidoCompraId))
            {
                TablasDataContext database = new TablasDataContext();
                //Se elimina el anterior detalle
                var tallas = (from pedidoTallas in database.CO_PedidoTalla
                              where pedidoTallas.CO_PedidoColor.PedCom_Id == PedidoCompraId
                              select pedidoTallas);

                foreach (var item in tallas)
                {
                    database.CO_PedidoTalla.DeleteOnSubmit(item);
                }

                var colores = (from pedidoColores in database.CO_PedidoColor
                               where pedidoColores.PedCom_Id == PedidoCompraId
                               select pedidoColores);

                foreach (var item in colores)
                {
                    database.CO_PedidoColor.DeleteOnSubmit(item);
                }

                var estilos = (from pedidoEstilos in database.CO_PedidoEstilo
                               where pedidoEstilos.PedCom_Id == PedidoCompraId
                               select pedidoEstilos);

                foreach (var item in estilos)
                {
                    database.CO_PedidoEstilo.DeleteOnSubmit(item);
                }

                //Se elimina la cabecera
                CO_PedidoCompra pedido = database.CO_PedidoCompra.FirstOrDefault(c => c.PedCom_Id == PedidoCompraId);
                database.CO_PedidoCompra.DeleteOnSubmit(pedido);

                database.SubmitChanges();
                hdnSeleccion.Value = "";
            }
            else
            {
                warningMessage.Visible = true;
                lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
            }
        }

        protected void gvPagerPageChanged(object sender, DataNavigatorEventArgs e)
        {
            ListarPedidos();
        }

        private void ListarPedidos()
        {
            TablasDataContext database = new TablasDataContext();

            int codigo = txtCodigo.Text == string.Empty ? 0 : Convert.ToInt32(txtCodigo.Text);
            var listarQuery = from pedidos in database.CO_PedidoCompra
                              where (pedidos.PedCom_Id == codigo || codigo == 0)
                                    && (pedidos.TG_Cliente.Nombre.Contains(clienteSearch.NombreSeleccionado) || clienteSearch.NombreSeleccionado == string.Empty)
                                    && (pedidos.TG_Temporada.Descripcion.Contains(temporadaSearch.DescripcionSeleccionado) || temporadaSearch.DescripcionSeleccionado == string.Empty)
                              select pedidos;

            foreach (var item in listarQuery)
            {
                
            }

            var listaContadores = from pedidosTallas in database.CO_PedidoTalla
                                  group pedidosTallas by pedidosTallas.CO_PedidoColor.PedCom_Id into g
                                  select new
                                  {
                                      CodigoPedido = g.Key,
                                      PrendasProducir = g.Sum(c => c.PedTal_CantidadProducida),
                                      PrendasSolicitadas = g.Sum(c => c.PedTal_CantidadSolicitada),
                                      Total = g.Sum(c => c.PedTal_CantidadSolicitada * c.PedTal_Precio)
                                  };

            foreach (var item in listaContadores)
            {
                PedidoContadorList.Add(new PedidoContador()
                {
                    CodigoPedido = item.CodigoPedido,
                    PrendasProducir = item.PrendasProducir.Value,
                    PrendasSolicitadas = item.PrendasSolicitadas.Value,
                    Total = item.Total.Value
                });
            }

            listarQuery = OrdenarQuery(listarQuery);

            var listarQuery1 = listarQuery.Skip((gvPager.CurrentPage - 1) * gvPager.PageSize).Take(gvPager.PageSize).ToList();

            gvPedidosCompra.DataSource = listarQuery1;
            gvPedidosCompra.DataBind();

            int totalReg = listarQuery.Count();

            if (totalReg > 0)
            {
                gvPedidosCompra.UseAccessibleHeader = false;
                gvPedidosCompra.HeaderRow.TableSection = TableRowSection.TableHeader;
                gvPager.Visible = true;
                gvPager.TotalRowCount = totalReg;
                warningMessage.Visible = false;
            }
            else
            {
                lblWarningMessage.Text = Resources.MensajesValidacion.NoDataFound;
                warningMessage.Visible = true;
                gvPager.Visible = false;
            }

            lblMensajeGridFooter.Text = String.Format(Resources.MensajesValidacion.GridFooterMessage, totalReg);
            ActivaIconoOrdenamiento();
        }

        private void ActivaIconoOrdenamiento()
        {
            if (gvPedidosCompra.HeaderRow == null)
            {
                return;
            }

            LinkButton lnkSender = null;
            LinkButton lnkSortDown = null;
            LinkButton lnkSortUp = null;

            if (this.SortDirection != null && this.SortDirection.ToUpper().Equals("ASC"))
            {
                lnkSender = (LinkButton)gvPedidosCompra.HeaderRow.FindControl("lnkSortUp" + this.SortExpression);
                if (lnkSender != null)
                    lnkSortDown = (LinkButton)gvPedidosCompra.HeaderRow.FindControl(lnkSender.ID.Replace("SortUp", "SortDown"));
                if (lnkSortUp != null) lnkSortDown.CssClass = "sort-down";
                if (lnkSender != null) lnkSender.CssClass = "sort-up active";
            }
            else
            {
                lnkSender = (LinkButton)gvPedidosCompra.HeaderRow.FindControl("lnkSortDown" + this.SortExpression);
                if (lnkSender != null)
                    lnkSortUp = (LinkButton)gvPedidosCompra.HeaderRow.FindControl(lnkSender.ID.Replace("SortDown", "SortUp"));

                if (lnkSortUp != null) lnkSortUp.CssClass = "sort-up";
                if (lnkSender != null) lnkSender.CssClass = "sort-down active";
            }
        }

        protected void gvPedidosCompra_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                var pedido = (CO_PedidoCompra)(e.Row.DataItem);

                Label lblEstado = (Label)e.Row.FindControl("lblEstado");
                if (lblEstado != null && lblEstado.Text != string.Empty)
                {
                    lblEstado.Text = lblEstado.Text == "R" ? "REGISTRADO" : "OPERATIVO";
                }

                if (PedidoContadorList.Count > 0 && PedidoContadorList.Find(c => c.CodigoPedido == pedido.PedCom_Id) != null)
                {
                    Label lblTotal = (Label)e.Row.FindControl("lblTotal");
                    if (lblTotal != null && lblTotal.Text == string.Empty)
                    {
                        lblTotal.Text = PedidoContadorList.Find(c => c.CodigoPedido == pedido.PedCom_Id).Total.ToString("#,##0.00");
                    }

                    Label lblPrendasSol = (Label)e.Row.FindControl("lblPrendasSol");
                    if (lblPrendasSol != null && lblPrendasSol.Text == string.Empty)
                    {
                        lblPrendasSol.Text = PedidoContadorList.Find(c => c.CodigoPedido == pedido.PedCom_Id).PrendasSolicitadas.ToString();
                    }

                    Label lblPrendasProd = (Label)e.Row.FindControl("lblPrendasProd");
                    if (lblPrendasProd != null && lblPrendasProd.Text == string.Empty)
                    {
                        lblPrendasProd.Text = PedidoContadorList.Find(c => c.CodigoPedido == pedido.PedCom_Id).PrendasProducir.ToString();
                    }
                }
            }
        }


        private IQueryable<CO_PedidoCompra> OrdenarQuery(IQueryable<CO_PedidoCompra> listarQuery)
        {
            if (this.SortExpression == null || this.SortExpression.Trim().Equals(""))
            {
                this.SortExpression = "Id";
            }

            if (this.SortDirection == null || this.SortDirection.Trim().Equals(""))
            {
                this.SortDirection = "DES";
            }

            if (this.SortExpression == "Id")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.PedCom_Id);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.PedCom_Id);
                }
            }
            else if (this.SortExpression == "Cliente")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.TG_Cliente.Nombre);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.TG_Cliente.Nombre);
                }
            }
            else if (this.SortExpression == "Temporada")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.TG_Temporada.Descripcion);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.TG_Temporada.Descripcion);
                }
            }
            else if (this.SortExpression == "Estado")
            {
                if (this.SortDirection.ToUpper().Equals("ASC"))
                {
                    listarQuery = listarQuery.OrderBy(c => c.PedCom_Estado);
                }
                else
                {
                    listarQuery = listarQuery.OrderByDescending(c => c.PedCom_Estado);
                }
            }


            return listarQuery;
        }

        protected void gvPedidosCompra_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (gvPedidosCompra.HeaderRow == null)
                {
                    return;
                }

                this.SortExpression = e.CommandArgument != null ? e.CommandArgument.ToString() : "Id";
                this.SortDirection = e.CommandName.Equals("SortUp") ? "ASC" : "DES";

                ListarPedidos();

            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

    }
}